#ifndef JUGADOR_H
#define JUGADOR_H

#include <iostream>
#include <sstream>
#include <string.h>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <vector>
#include <stdio.h>
#include <map>
#include <pthread.h>
#include <time.h>
#include "../parser/parser.h"
#include "datos.h"
#include "../sockets/udpclient.h"
#include "../punto/punto.h"
#include "../threads/ThreadEnviar.h"
#include "../threads/ThreadRecibir.h"

class Jugador
{

    /**
     * @var numero
     * @var cicloGolpeo
     * @var alpha
     * @var dirPorteria
     * @var distPorteria
     * @var veoPelota
     * @var
     */
    int numero;                 ///< Número de dorsal del jugador.
    int cicloGolpeo;            ///< Número del ciclo en el que golpeamos la pelota.
    double alpha;               ///< Ángulo absoluto hacia donde mira el jugador.
    double dirPorteria;         ///< Dirección relativa a nosotros de la portería contraria.
    double distPorteria;        ///< Distancia relativa a nosotros de la portería contraria.
public:
    clock_t te,tr;
    bool veoPelota;             ///< Booleano que dice si el jugador está viendo la pelota o no.
    bool cercaLinea;            ///< Booleano que dice si el jugador está cerca de alguna línea del borde del campo.
    Jugador();
    Jugador(int argc, char *argv[]);
    Punto posicion;             ///< Posición de nuestro jugador.
    Punto pos_inicial;          ///< Posición inicial donde se coloca nuestro jugador.
    Punto pos_play;             ///< Posición donde se coloca nuestro jugador durante el partido.
    UDPclient cliente;          ///< Variable de tipo socket UDP.
    ThreadEnviar enviar;        ///< Variable Thread para enviar información.
    ThreadRecibir recibir;      ///< Variable Thread para recibir información.
    Parser parser;              ///< Variable de tipo parser.
    Datos datos;                ///< Aquí almacenamos nuestros datos
    int refereeMode;            ///< Modo de juego dictado por el árbitro.
    bool thread_flag;           ///< Flag necesario para sincronizar los flags.
    pthread_mutex_t _mutex;     ///< Mutex necesario para sincronizar los flags.

    Jugador* jugador;           ///< Necesario para el thread.
    stringstream msg;           /**< Almacenamos el mensaje que vayamos a enviar desde el thread,
                                * es de tipo stringstream, el cual nos permite introducir comodamente
                                * los valores a enviar, para utilizar esta variable como string basta
                                * con llamar a "msg.str()"
                                */
    int getnumero();
    void setnumero(int Nnumero);
    double getalpha();
    void setalpha(double num);
    void mover(float pot);
    void girar(float ang);
    bool golpear(float pot,float dir);
    void mirar (float ang);
    void interpretar(string h);//
    bool buscarPelota();
    void seguirPelota(bool balonzonaJugador);
    void seguirPelota();
    void colocar(double x, double y);
    void comprobar_pelota(string h);
    void correr();
    void buscarIndicador(string indicador);
    void esperarInicio();
    void setPosicion(string h);
    Punto getPosicion();
    void goTo(Punto p);
    void hearReferee();
    void goTo (double x, double y);
    void posicionPorteria();
    bool distanciaJugadoresPropios(float distancia);
    bool jugadorPropioCercaBalon();
    bool distanciaJugadoresContrarios(float distancia);
    Punto posicionJugadorPropio(int dorsal);
    Punto posicionPelota();
};

float checkAngulo(float _angulo);
float checkPotencia(float _potencia);


#endif //JUGADOR_H
